<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
    对象的遍历：
    * 1.for...in循环遍历对象自身的和继承的可枚举属性（不含 Symbol 属性）。
    * 2.Object.keys(obj)返回一个数组，包括对象自身的（不含继承的）所有可枚举属性（不含 Symbol 属性）的键名。
		* 3.Object.getOwnPropertyNames(obj)返回一个数组，包含对象自身的所有属性（不含 Symbol 属性，但是包括不可枚举属性）的键名。
		* 4.Object.getOwnPropertySymbols(obj)返回一个数组，包含对象自身的所有 Symbol 属性的键名。
		* 5.Reflect.ownKeys(obj)返回一个数组，包含对象自身的（不含继承的）所有键名，不管键名是 Symbol 或字符串，也不管是否可枚举。
	总结：
	以上的 5 种方法遍历对象的键名，都遵守同样的属性遍历的次序规则:
	- 首先遍历所有数值键，按照数值升序排列。
	- 其次遍历所有字符串键，按照加入时间升序排列。
	- 最后遍历所有 Symbol 键，按照加入时间升序排列。
	
-->
<script type='text/javascript'>
	// 1.for...in循环遍历对象自身的和继承的可枚举属性（不含 Symbol 属性）。
	const obj = {
	   id:1,
	   name:'独孤求败',
	   age:41,
	}
	for(let key in obj){
		console.log(key+'--'+obj[key])
	}
	
	// 2.Object.keys(obj)返回一个数组，包括对象自身的（不含继承的）所有可枚举属性（不含 Symbol 属性）的键名。
	const keys=Object.keys(obj)
	console.log(keys)//["id", "name", "age"]
	
	const values=Object.values(obj)
	console.log(values)//[1, "独孤求败", 41]

  const entries=Object.entries(obj)
	console.log(entries)//[Array(2), Array(2), Array(2)]
	console.log(entries.flat())//["id", 1, "name", "独孤求败", "age", 41]
	// console.log(entries instanceof Array)
	
	// 3.Object.getOwnPropertyNames(obj)返回一个数组，包含对象自身的所有属性（不含 Symbol 属性，但是包括不可枚举属性）的键名。
	const Names=Object.getOwnPropertyNames(obj)
	console.log(Names)// ["id", "name", "age"]

</script>
</body>
</html>